import axios from "axios";
import router from "@/router";
import { Message } from "element-ui";
// import { getToken, removeToken } from "@/utils/auth";

// 创建请求实例类
class RequestInstance {
  constructor(config = {}) {
    this.instance = axios.create({
      baseURL: config.baseURL || process.env.VUE_APP_BASE_URL,
      timeout: config.timeout || 50000,
      headers: {
        "Content-Type": "application/json;charset=utf-8",
        ...config.headers,
      },
    });

    // 请求拦截器
    this.instance.interceptors.request.use(
      (config) => {
        // 从localStorage获取token
        // const token = getToken();
        // if (token) {
        //   config.headers.Authorization = `Bearer ${token}`;
        // }
        return config;
      },
      (error) => {
        return Promise.reject(error);
      }
    );

    // 响应拦截器
    this.instance.interceptors.response.use(
      (response) => {
        const { data, config } = response;
        const custom = config?.custom || {};

        // 如果响应状态码不是200
        if (data.status_code !== 200) {
          // 显示错误消息
          if (data.message) {
            Message.error(data.message);
          }

          // 处理401未授权
          if (data.status_code === 401) {
            // removeToken();
            router.push("/login");
            return Promise.reject(new Error("未授权，请重新登录"));
          }

          // 如果需要catch返回，则进行reject
          if (custom?.catch) {
            return Promise.reject(data);
          }

          // 否则返回一个pending中的promise，请求不会进入catch中
          return new Promise(() => {});
        }

        // 返回数据
        return data.data === undefined ? {} : data.data;
      },
      (error) => {
        // 处理网络错误
        if (error.message.includes("timeout")) {
          Message.error("请求超时，请检查网络连接");
        } else if (error.message.includes("Network Error")) {
          Message.error("网络错误，请检查网络连接");
        }

        // 处理HTTP错误
        if (error.response) {
          switch (error.response.status) {
            case 401:
              // removeToken();
              router.push("/login");
              break;
            case 403:
              Message.error("拒绝访问");
              break;
            case 404:
              Message.error("请求错误，未找到该资源");
              break;
            case 500:
              Message.error("服务器错误");
              break;
            default:
              Message.error(`连接错误${error.response.status}`);
          }
        }

        return Promise.reject(error);
      }
    );
  }
}

// 创建默认请求实例
const defaultReq = new RequestInstance({
  baseURL: process.env.VUE_APP_BASE_URL,
  timeout: 50000,
}).instance;

// 创建mock请求实例
const mockReq = new RequestInstance({
  baseURL: "/",
  timeout: 50000,
}).instance;

// 导出请求实例
export { defaultReq, mockReq };
